//加个砖块击中砖块 
#include<stdio.h>
#include<stdlib.h>
#include<conio.h> 
#include<windows.h>

//全局变量 
int high,width;     //游戏画面尺寸 
int ball_x,ball_y;   //小球的坐标
int ball_vx,ball_vy;  //小球的速度
int position_x,position_y;//挡板的中心坐标 
int radius;             //挡板的半径大小 
int left, right;        //挡板的左右边界 
int ball_number;        //反弹小球数 
int brick_x,brick_y;    //砖块的坐标 
 
void gotoxy(int x,int y)//光标移动到x，y位置 
{
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
} 

void HideCursor()         //隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
}

void startup() //数据初始化 
{
	high=18;
	width=25;
	
	ball_x=1;
	ball_y=width/2;
	
	ball_vx=1;
	ball_vy=1;
	
	position_x=high;
	position_y=width/2;
	radius=5;
	left=position_y-radius;
	right=position_y+radius;
	
	ball_number=0;
	
	brick_x=0;
	brick_y=width/2;
	
	HideCursor();  //隐藏光标 
} 
void show() //显示画面
{
	gotoxy(0,0);
	
	int i,j;
	for(i=0;i<=high+1;i++)
	{
		for(j=0;j<=width;j++)
		{
			if((i==ball_x)&&(j==ball_y))
			printf("o");   //输出小球o
			else if(j==width)
			printf("|");    //输出右边界
			else if(i==high+1)
			printf("-");    //输出下边界 
			else if((i==high)&&(j>=left)&&(j<=right))
			printf("*");   //输出挡板 
			else if((i==brick_x)&&(j==brick_y))
			printf("B");   //输出砖块 
			else 
			printf(" ");    //输出空格 
		}
		printf("\n"); 
	} 
	printf("反弹小球数：%d\n",ball_number);
} 

void updateWithoutInput()    //输入与用户无关的更新 
{
	if((ball_x==brick_x)&&(ball_y==brick_y))  //消砖块 
	{
		ball_number++;
		brick_y=rand()%width;   //产生新的砖块 
		printf("\a");
	} 
	
	
	if(ball_x==high-1)       //反弹小球 
	{
		if((ball_y>=left)&&(ball_y<=right))
		{
			ball_number++;
			//ball_vy=-ball_vy;
			printf("\a");
		}
		else
		{
			printf("Game over！");
			exit(0);
			
		}
	}
	//根据速度更新小球的位置 
	ball_x=ball_x+ball_vx;
	ball_y=ball_y+ball_vy;
	//碰到边界后改变速度的方向 ,实现反弹 
	if((ball_x==0)||(ball_x==high-1))
	   ball_vx=-ball_vx;
	if((ball_y==0)||(ball_y==width-1))
	   ball_vy=-ball_vy;
	
	Sleep(100); 
}
void updateWithInput()  //与用户输入有关的更新
{
	char input;
	if(kbhit())   //判断是否有输入
	{
		input=getch();  //根据用户的不同输入来判断 
		if((input=='a')&&(left>0))
		{
			position_y--;
			left=position_y-radius;
	        right=position_y+radius;
		}
		if((input=='d')&&(right<width-1))
		{
			position_y++;
			left=position_y-radius;
	        right=position_y+radius;
		}
	} 
} 

int main()
{
	startup();         //数据初始化 
	while(1)           //游戏循坏执行 
	{
		show();      //显示画面 
		updateWithoutInput();  //与用户输入无关的更新 
		updateWithInput();     //与用户输入有关的更新 
	}
    
	return 0;
} 